function nexpr = expand(expr, varargin)
    % nexpr = expand(expr)
    % 展开符号表达式expr中的所有括号
    % nexpr = expand(expr, name, value)
    % nexpr = expand(expr, name, value) 可以增加选项控制表达式展开方式。例如：
    % 'ArithmeticOnly', true 表示只做代数展开，不涉及三角函数，指数等，默认是false。'IgnoreAnalyticConstraints', true 表示展开指数，默认false。
    
    % 例子：
    % Input [1] >> [x,y] = syms('x y');
    % Input [2] >> expr = (x + y)*cos(x-y);
    % Input [3] >> expand(expr)
    % x*sin(x)*sin(y) + x*cos(x)*cos(y) + y*sin(x)*sin(y) + y*cos(x)*cos(y)
    % Input [4] >> expand(expr,'ArithmeticOnly',true)
    % x*cos(x - y) + y*cos(x - y) 
    p = inputParser;
    p = addParameter(p, "ArithmeticOnly", false, @BoolCheck);
    p = addParameter(p, "IgnoreAnalyticConstraints", false, @BoolCheck);

    p = parse(p, varargin{:});

    sp = sympy_sp();
    if ~p.Results.ArithmeticOnly
        expr = sp.expand_trig(expr);
    end

    if ~p.Results.IgnoreAnalyticConstraints
        expr = sp.expand_log(expr, 'force', true);
    end
    
    nexpr = sp.expand(expr);
end 

function BoolCheck(x)
    % if isbool(x); error("必须输入true/false"); end
end